package exercise.jslide.jslide.command;

import exercise.jslide.jslide.model.SlideElement;

/**
 * <p>{@code MoveCommand} 类是一个命令类，用于移动幻灯片元素。</p>
 * <p>该类实现了 {@code Command} 接口，提供了执行、撤销和重做操作。</p>
 * <p>该类包含了一个 {@code SlideElement} 对象和四个 double 类型的变量。</p>
 * <p>在执行操作时，会移动幻灯片元素到新的位置；在撤销操作时，会将幻灯片元素移动到旧的位置。
 * 在重做操作时，会重新将幻灯片元素移动到新的位置。</p>
 * <p>该类提供了获取和设置幻灯片元素的方法。</p>
 * <ul>
 *     <li>{@code  element}：幻灯片元素对象</li>
 *     <li>{@code oldX}：幻灯片元素的旧 X 坐标</li>
 *     <li>{@code oldY}：幻灯片元素的旧 Y 坐标</li>
 *     <li>{@code newX}：幻灯片元素的新 X 坐标</li>
 *     <li>{@code newY}：幻灯片元素的新 Y 坐标</li>
 * </ul>
 */
public class MoveCommand implements Command {
    private SlideElement element;
    private double oldX, oldY;
    private double newX, newY;

    /**
     * 该构造方法用于初始化 {@code MoveCommand} 对象。
     * @param element 幻灯片元素对象
     * @param oldX 幻灯片元素的旧 X 坐标
     * @param oldY 幻灯片元素的旧 Y 坐标
     * @param newX 幻灯片元素的新 X 坐标
     * @param newY 幻灯片元素的新 Y 坐标
     */
    public MoveCommand(SlideElement element, double oldX, double oldY, double newX, double newY) {
        this.element = element;
        this.oldX = oldX;
        this.oldY = oldY;
        this.newX = newX;
        this.newY = newY;
    }

    /**
     * 该方法用于移动幻灯片元素到新的位置。
     */
    @Override
    public void execute() {
        element.setX(newX);
        element.setY(newY);
    }

    /**
     * 该方法用于将幻灯片元素移动到旧的位置。
     */
    @Override
    public void undo() {
        element.setX(oldX);
        element.setY(oldY);
    }

    /**
     * 该方法用于重做操作。
     */
    @Override
    public void redo() {
        execute();
    }
}